package com.mytemplate;

/**
 * 办理银行业务-抽象基类
 * @author yulipeng
 *
 *	去银行办理业务；
//		step1:进门取号；
//		step2x:填写资料；
//		step3:等待叫号；
//		step4x:窗口办理；
 */
public abstract class BankBusinessAbstract {

	/**
	 * 办理银行业务-的模板方法；
	 * 封装了所有子类共同遵守的算法框架；
	 * final-禁止子类实现
	 */
	public final void prepareHandleBusiness(){
		// step1:进门取号；
		takeTheNumber();
		
		if (isDramMoney()) {
			// step2x:填写资料；
			fillInInformation();
		}
		
		// step3:等待叫号；
		waitingForCall();
		// step4x:窗口办理；
		windowHanding();
	}

	/**
	 * 使用钩子Hook方法，提供默认或空的实现；子类判断是否需要挂钩；
	 * 取钱不需要填写资料；
	 * 这样更加灵活
	 * @return
	 */
	public boolean isDramMoney() {
		return true;
	}

	/**
	 * step1:进门取号；
	 * 基本通用方法；(不变)
	 */
	private void takeTheNumber() {
		System.out.println("step1:进门取号...");
	}
	
	/**
	 * step2x:填写资料
	 * 抽象方法-子类实现
	 */
	public abstract void fillInInformation();
	
	/**
	 * step3:等待叫号；
	 * 基本通用方法；(不变)
	 */
	private void waitingForCall() {
		System.out.println("step3:等待叫号...");
	}
	
	/**
	 * step4x:窗口办理；
	 * 抽象方法-子类实现
	 */
	public abstract void windowHanding();

	
}
